home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Sound Cards
/
Programming Sound Cards.iso
/
sound_34
/
gus.asm
next >
Wrap
Assembly Source File
|
1995-01-01
|
14KB
|
841 lines
Jumps
.286
_Stack Segment Para Stack 'Stack'
db 100h dup (0)
_Stack ends
Extrn MainVolume:Word,ChanOn:Word,PatternRow:Word,RealRow:Word,OrderLen:Byte
Extrn PlayingPattern:Word,RealPPattern:Word,Time:DWord,SampChans:Byte
Extrn Bar:Byte,NumChans:Word,BasePort:Word,ErrorCode:Word
Extrn LoadMod:Far,ClearMem:Far,StartPlaying:Far,StopPlaying:Far,Init:Far
Extrn InitDevice:Far
_Code Segment Para 'Code'
assume cs:_Code
ModToRead db 70 dup (0)
CommandLine db 127 dup (0)
KeySeg dw 0
KeyOfs dw 0
Key db 0
CommandLineC db 0,'',0Dh
Error db ' Internal Error. Restart the computer and try again.$'
OutOfMem db ' Not enough memory!$'
WrongName db ' File or path not found!$'
Docs db 13,10
db ' Module Player v1.5 (C) Robert Adolfsson (Cascada) 1993.',13,10
db 13,10
db ' For Advanced Gravis UltraSound',13,10
db ' Supports Noisetracker/Soundtracker/StarTrecker (AmigaTrackers)',13,10
db ' FastTracker 4,6 or 8 channels/OctaComposer (PCTrackers)',13,10
db 13,10
db ' Syntax: GUSPLAY <[Path]Filename.ext> /baseport.',13,10
db ' Where baseport is a three digit hexadecimal number (Def=220).',13,10
db '$'
Palette db 63,00,00
db 56,00,08
db 48,00,16
db 40,00,24
db 32,00,32
db 24,00,40
db 16,00,48
db 08,00,56
db 00,00,63
db 63,63,00
db 63,26,00
db 48,63,00
db 00,63,00
db 00,00,00
db 00,00,00
db 63,63,63
Pic db ' Modplay v1.5 for Gravis Ultrasound (C) Robert Adolfsson CASCADA '
db ' '
db ' '
db ' Position / Row /64 Time : MainVolume /64 '
db ' '
db ' PgUp/PgDn : Change position. 1-8 : Turn channels on/off. +/- : MainVolume '
db ' D : Dosshell '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db ' '
db 80 dup (0Fh)
db 80 dup (19h)
db 80 dup (29h)
db 80 dup (39h)
db 80 dup (49h)
db 80 dup (59h)
db 80 dup (69h)
db 80 dup (79h)
db 80 dup (80h)
db 80 dup (7Ah)
db 80 dup (69h)
db 80 dup (5Bh)
db 80 dup (4Ch)
db 80 dup (5Ch)
db 80 dup (6Ch)
db 80 dup (7Ch)
db 80 dup (89h)
db 80 dup (70h)
db 80 dup (6Ah)
db 80 dup (59h)
db 80 dup (4Bh)
db 80 dup (3Ch)
db 80 dup (2Ch)
db 80 dup (1Ch)
db 80 dup (0Ch)
EvenData
PrintTable db 0,0,0,0
Rept 127
db 0,0,0,0
EndM
BarTable dw 8 dup (0)
ComSpec db 128 dup (0)
PSPAdress dw 0
OldSS dw 0
OldSP dw 0
Environment dw 0 ; Environment segment.
dw 0,0 ; Commandline segment and offset.
dw 0,0 ; First FCB segment and offset.
dw 0,0 ; Second FCB segment and offset.
SetPalReg Macro P,R,G,B
mov dx,3C8h
mov al,P
out dx,al
inc dx
mov al,R
out dx,al
mov al,G
out dx,al
mov al,B
out dx,al
EndM
Even
Begin:
mov cs:[PSPAdress],es
push es
call GetFileName
pop ds
call GetComSpec
mov ax,cs
mov ds,ax
mov ax,4A00h
mov bx,18129/16+1
int 21h
jnc NoStop
mov ah,9
push cs
pop ds
mov dx,offset cs:[Error]
int 21h
jmp Stop
NoStop:
call InitDevice
call Init
mov dx,cs
mov ds,dx
mov dx,offset cs:[ModToRead]
call LoadMod
jnc NoErrorLoad
mov ax,seg MainVolume
mov ds,ax
cmp ds:[ErrorCode],1
jne NoFile
mov dx,offset cs:[WrongName]
NoFile:
cmp ds:[ErrorCode],3
jne NoMem
mov dx,offset cs:[OutOfMem]
NoMem:
push cs
pop ds
mov ah,9
int 21h
jmp Stop
NoErrorLoad:
mov di,cs
mov es,di
mov di,offset cs:[PrintTable]
mov cx,128
mov al,30h
mov ah,30h
mov bl,30h
mov bh,30h
FillPTable:
mov es:[di],al
mov es:[di+1],ah
mov es:[di+2],bl
mov es:[di+3],bh
add di,4
inc al
cmp al,3Ah
jb NoWrapCount
mov al,30h
inc ah
cmp ah,3Ah
jb NoWrapCount
mov ah,30h
inc bl
cmp bl,3Ah
jb NoWrapCount
mov bl,30h
inc bh
NoWrapCount:
loop FillPTable
call StartPlaying
FromDosShell:
mov ax,3509h
int 21h
mov cs:[KeySeg],es
mov cs:[KeyOfs],bx
mov ax,2509h
mov dx,cs
mov ds,dx
mov dx,offset cs:[KeyInt]
int 21h
mov bl,0
mov ax,1003h
int 10h
MOV AH,0
SETPAL:
MOV DX,3DAH
IN AL,DX
MOV DX,3C0H
MOV AL,AH
OUT DX,AL
JMP $+2
OUT DX,AL
INC AH
CMP AH,16
JB SETPAL
MOV DX,3DAH
IN AL,DX
MOV DX,3C0h
MOV AL,20H
OUT DX,AL
mov si,cs
mov ds,si
mov si,offset cs:[Palette]
mov dx,3C8h
mov al,0
out dx,al
inc dx
mov cx,16*3
rep outsb
cld
mov di,0B800h
mov es,di
mov di,0
mov cx,2000
mov si,cs
mov ds,si
mov si,offset cs:[Pic]
LoadPic:
movsb
mov al,ds:[si+2000-1]
stosb
loop LoadPic
call ProgramChars
mov di,0A000h
mov es,di
cld
mov cx,9
FillCharLoop:
push cx
mov di,256
sub di,cx
shl di,5
neg cx
add cx,9
shl cx,1
mov bx,16
sub bx,cx
mov al,0h
rep stosb
mov al,3Eh
mov cx,bx
rep stosb
sub di,32+16
pop cx
loop FillCharLoop
mov di,0B800h
mov es,di
call NoProgramChars
mov ax,seg MainVolume
mov ds,ax
mov cx,ds:[NumChans]
cmp cx,6
je SixChans
cmp cx,8
je EigthChans
mov cs:[BarTable],17*80*2+01*2
mov cs:[BarTable+2],17*80*2+21*2
mov cs:[BarTable+4],17*80*2+41*2
mov cs:[BarTable+6],17*80*2+61*2
jmp FourChans
SixChans:
mov cs:[BarTable],8*80*2+21*2
mov cs:[BarTable+2],8*80*2+41*2
mov cs:[BarTable+4],17*80*2+01*2
mov cs:[BarTable+6],17*80*2+21*2
mov cs:[BarTable+8],17*80*2+41*2
mov cs:[BarTable+10],17*80*2+61*2
jmp FourChans
EigthChans:
mov cs:[BarTable],8*80*2+01*2
mov cs:[BarTable+2],8*80*2+21*2
mov cs:[BarTable+4],8*80*2+41*2
mov cs:[BarTable+6],8*80*2+61*2
mov cs:[BarTable+8],17*80*2+01*2
mov cs:[BarTable+10],17*80*2+21*2
mov cs:[BarTable+12],17*80*2+41*2
mov cs:[BarTable+14],17*80*2+61*2
FourChans:
mov di,19
mov dx,3
mov bh,0
mov bl,ds:[OrderLen]
call PrintVal
mov ah,2
mov bh,0
mov dh,25
mov dl,0
int 10h
mov ax,Seg MainVolume
mov ds,ax
mov ax,0B800h
mov es,ax
DoLoop:
mov dx,3DAh
Test1:
in al,dx
test al,8
jnz Test1
Test2:
in al,dx
test al,8
jz Test2
mov ax,Seg MainVolume
mov ds,ax
mov di,0B800h
mov es,di
mov di,69
mov dx,3
mov bx,ds:[MainVolume]
call PrintSec
mov di,15
mov dx,3
mov bx,ds:[RealPPattern]
call PrintVal
mov di,32
mov dx,3
mov bx,ds:[RealRow]
inc bx
call PrintSec
mov ax,Word Ptr cs:[Time]
mov dx,Word Ptr cs:[Time+2]
mov bx,1000
div bx
mov dx,0
mov bx,60
div bx
mov bx,ax
mov si,dx
mov dx,3
mov di,49
call PrintSec
mov bx,si
mov dx,3
mov di,52
call PrintSec
cld
mov si,offset ds:[SampChans]
mov cx,ds:[NumChans]
BarLoop:
push cx
mov di,ds:[NumChans]
sub di,cx
shl di,1
mov di,cs:[BarTable+di]
mov bx,Word Ptr ds:[si.Bar]
mov cx,63
sub cx,bx
shr cx,3
cmp cx,0
je NoSuddBar
cmp bx,0
SuddIt:
mov al,32
Rept 18
stosb
inc di
EndM
add di,160-2*18
loop SuddIt
NoSuddBar:
mov cx,bx
and bx,7
neg bl
dec bl
mov al,bl
Rept 18
stosb
inc di
EndM
add di,160-2*18
shr cx,3
cmp cx,0
je NoFillBar
mov al,255-8
FillSecond:
Rept 18
stosb
inc di
EndM
add di,160-2*18
loop FillSecond
NoFillBar:
sub ds:[si.Bar],1
jnc NoWBar
mov ds:[si.Bar],0
NoWBar:
pop cx
add si,52
dec cx
jnz BarLoop
EndPrintVals:
cmp cs:[Key],20h
jne NoDosShell
mov cs:[Key],0
pusha
push ds
push es
cli
mov cs:[OldSS],ss
mov cs:[OldSP],sp
sti
mov ax,2509h
mov ds,cs:[KeySeg]
mov dx,cs:[KeyOfs]
int 21h
mov ax,3
int 10h
mov cs:[Environment],0
mov cs:[Environment+2],Offset cs:[CommandLineC]
mov Word Ptr cs:[Environment+4],cs
mov cs:[Environment+6],5Ch
mov ax,cs:[PSPAdress]
mov Word Ptr cs:[Environment+8],ax
mov cs:[Environment+10],6Ch
mov Word Ptr cs:[Environment+12],ax
mov bx,cs
mov ds,bx
mov es,bx
mov bx,offset cs:[Environment]
mov dx,offset cs:[ComSpec]
mov ax,4B00h
int 21h
cli
mov ss,cs:[OldSS]
mov sp,cs:[OldSP]
sti
pop es
pop ds
popa
jmp FromDosShell
NoDosShell:
cmp cs:[Key],1
jne DoLoop
mov ax,2509h
mov ds,cs:[KeySeg]
mov dx,cs:[KeyOfs]
int 21h
call StopPlaying
call ClearMem
mov ax,3
int 10h
Stop:
mov ax,4C00h
int 21h
GetComSpec Proc Near
mov ds,ds:[2Ch]
mov si,0
FindComSpec:
lodsb
cmp al,0
jne NoTestEnd
lodsb
cmp al,0
je EndSearchEnv
NoTestEnd:
cmp al,'C'
jne FindComSpec
lodsb
cmp al,'O'
jne FindComSpec
lodsb
cmp al,'M'
jne FindComSpec
lodsb
cmp al,'S'
jne FindComSpec
lodsb
cmp al,'P'
jne FindComSpec
lodsb
cmp al,'E'
jne FindComSpec
lodsb
cmp al,'C'
jne FindComSpec
mov di,offset cs:[ComSpec]
inc si
LetsMoveIt:
lodsb
cmp al,0
je EndSearchEnv
mov cs:[di],al
inc di
jmp LetsMoveIt
EndSearchEnv:
ret
GetComSpec EndP
ProgramChars Proc Near
mov dx,3C4h
mov ax,0100h
out dx,ax
mov ax,0402h
out dx,ax
mov ax,0704h
out dx,ax
mov ax,0300h
out dx,ax
mov dx,3CEh
mov ax,0204h
out dx,ax
mov ax,0005h
out dx,ax
mov ax,0006h
out dx,ax
ret
ProgramChars EndP
NoProgramChars Proc Near
mov dx,3C4h
mov ax,0100h
out dx,ax
mov ax,0302h
out dx,ax
mov ax,0304h
out dx,ax
mov ax,0300h
out dx,ax
mov dx,3CEh
mov ax,0004h
out dx,ax
mov ax,1005h
out dx,ax
mov ax,0E06h
out dx,ax
ret
NoProgramChars EndP
PrintChar Proc Near
shl di,1
shl dx,5
add di,dx
shl dx,2
add di,dx
stosb
ret
PrintChar EndP
PrintVal Proc Near
cld
shl di,1
shl dx,5
add di,dx
shl dx,2
add di,dx
shl bx,2
mov al,cs:[PrintTable+bx+2]
stosb
inc di
mov al,cs:[PrintTable+bx+1]
stosb
inc di
mov al,cs:[PrintTable+bx]
stosb
ret
PrintVal EndP
PrintSec Proc Near
cld
shl di,1
shl dx,5
add di,dx
shl dx,2
add di,dx
shl bx,2
mov al,cs:[PrintTable+bx+1]
stosb
inc di
mov al,cs:[PrintTable+bx]
stosb
ret
PrintSec EndP
KeyInt Proc Near
push ax
push ds
mov ax,Seg MainVolume
mov ds,ax
in al,60h
cmp al,127
ja NoKey
mov cs:[Key],al
NoKey:
cmp al,74
jne NoVolDown
sub [MainVolume],1
jns NoVolDown
mov [MainVolume],0
NoVolDown:
cmp al,78
jne NoVolUp
add [MainVolume],1
cmp [MainVolume],64
jbe NoVolUp
mov [MainVolume],64
NoVolUp:
cmp al,81
jne NoChangePatt1
mov [PatternRow],64
NoChangePatt1:
cmp al,73
jne NoChangePatt2
mov [PatternRow],64
sub [PlayingPattern],2
jns NoChangePatt2
mov [PlayingPattern],0
NoChangePatt2:
cmp al,2
jne NoChan1OnOff
xor [ChanOn],00000001b
NoChan1OnOff:
cmp al,3
jne NoChan2OnOff
xor [ChanOn],00000010b
NoChan2OnOff:
cmp al,4
jne NoChan3OnOff
xor [ChanOn],00000100b
NoChan3OnOff:
cmp al,5
jne NoChan4OnOff
xor [ChanOn],00001000b
NoChan4OnOff:
cmp al,6
jne NoChan5OnOff
xor [ChanOn],00010000b
NoChan5OnOff:
cmp al,7
jne NoChan6OnOff
xor [ChanOn],00100000b
NoChan6OnOff:
cmp al,8
jne NoChan7OnOff
xor [ChanOn],01000000b
NoChan7OnOff:
cmp al,9
jne NoChan8OnOff
xor [ChanOn],10000000b
NoChan8OnOff:
in al,61h
or al,80h
out 61h,al
and al,7Fh
out 61h,al
mov al,20h
out 20h,al
pop ds
pop ax
iret
KeyInt EndP
GetFileName Proc Near
push bx
push di
mov di,offset cs:[CommandLine]
mov bx,82h
mov al,es:[bx-2]
cmp al,0
jne TestNext
jmp NoCmdLine
TestNext:
mov al,es:[bx]
cmp al,0
jne GetIt
jmp NoCmdLine
GetIt:
mov al,es:[bx]
inc bx
mov cs:[di],al
inc di
cmp al,0Dh
je GotIt
jmp GetIt
GotIt:
mov di,offset cs:[CommandLine]
mov bx,offset cs:[ModToRead]
MoveName:
mov al,cs:[di]
inc di
cmp al,0Dh
jne NotYetCommand
jmp EndMoveName
NotYetCommand:
cmp al,32
je CheckCommands
mov cs:[bx],al
inc bx
jmp MoveName
CheckCommands:
mov al,cs:[di]
inc di
cmp al,0Dh
je EndMoveName
cmp al,'/'
jne NoNewBase
mov bh,0
mov bl,cs:[di]
cmp bl,'A'
jb UsSub1
sub bl,'A'
add bl,10
jmp NoUsSub1
UsSub1:
sub bl,30h
NoUsSub1:
mov ah,bl
mov bl,cs:[di+1]
cmp bl,'A'
jb UsSub2
sub bl,'A'
add bl,10
jmp NoUsSub2
UsSub2:
sub bl,30h
NoUsSub2:
shl bl,4
mov al,bl
mov bl,cs:[di+2]
cmp bl,'A'
jb UsSub3
sub bl,'A'
add bl,10
jmp NoUsSub3
UsSub3:
sub bl,30h
NoUsSub3:
add ax,bx
mov bx,Seg MainVolume
mov ds,bx
mov ds:[BasePort],ax
add di,3
NoNewBase:
jmp CheckCommands
EndMoveName:
pop di
pop bx
ret
GetFileName Endp
NoCmdLine:
mov ah,9
push cs
pop ds
mov dx,offset cs:[Docs]
int 21h
mov ax,4C00h
int 21h
_Code EndS
End Begin